#pragma once
#include<iostream>
#include<pthread.h>
#include<string.h>
#include<functional>
#include<assert.h>
using namespace std;

class thread
{
  private:
  static void* start_rontine(void* args)//传递this指针过来
{
thread* ts=static_cast<thread*>(args);
ts->callback();//调用函数，该函数调用外部传进来的函数
}
public:
typedef  function<void* (void*)> func_t;//包装器构建返回值类型为void* 参数类型为void* 的函数类型
const int num=1024;
 thread()//构造函数--只负责初始化线程名，不负责创建线程，创建线程的函数是start
 {
char namebuffer[num];
snprintf(namebuffer,sizeof namebuffer,"thread-%d",number++);//缓冲区内保存线程的名字即几号线程
 name_=namebuffer;
 }

void start(func_t fun,void* args=nullptr)//创建线程
{
  fun_=fun;//外面传进来的需要调用的函数
  args_=args;//外面传进来需要给调用的函数传的参数
  int n=pthread_create(&pid_,nullptr,start_rontine,this);//因为调用函数start_rontine是类内函数，具有缺省参数this指针，在后续解包参数包会出问题，所以需要一个类来直接获取函数参数
assert(n==0);
(void)n;
}

void* callback(){return fun_(args_);}//调用外部传进来的函数

void join()
{
  int n=  pthread_join(pid_,nullptr);
  assert(n==0);
  (void)n;
}

string threadname()//供外部去调用
{
  return name_;
}

~thread()
{
    //
}

    private:
    string name_;//线程的名字
    pthread_t pid_;//线程id
  func_t fun_;//线程调用的函数对象
  void* args_;//线程调用的函数的参数
  static int number;//类中声明

};

int thread::number=1;//类外定义
